Micron Document
🎖️GitЯра🎖️


Displaying Raw • Download

feature/messaging/src/main/kotlin/org/meshtastic/feature/messaging/MessageViewModel.kt 78274c792318331b11ab64cd28e58e829875b8c2 (78274c79) Text, 9.68 KB

T8b949e/*
* Copyright (c) 2025 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

Tff7b72package T7ee787org.meshtastic.feature.messaging

Tff7b72import T7ee787android.os.RemoteException
Tff7b72import T7ee787androidx.lifecycle.SavedStateHandle
Tff7b72import T7ee787androidx.lifecycle.ViewModel
Tff7b72import T7ee787androidx.lifecycle.viewModelScope
Tff7b72import T7ee787androidx.paging.PagingData
Tff7b72import T7ee787androidx.paging.cachedIn
Tff7b72import T7ee787dagger.hilt.android.lifecycle.HiltViewModel
Tff7b72import T7ee787kotlinx.coroutines.Dispatchers
Tff7b72import T7ee787kotlinx.coroutines.flow.Flow
Tff7b72import T7ee787kotlinx.coroutines.flow.MutableStateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.StateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.asStateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.filterNotNull
Tff7b72import T7ee787kotlinx.coroutines.flow.flatMapLatest
Tff7b72import T7ee787kotlinx.coroutines.flow.update
Tff7b72import T7ee787kotlinx.coroutines.launch
Tff7b72import T7ee787org.meshtastic.core.data.repository.NodeRepository
Tff7b72import T7ee787org.meshtastic.core.data.repository.PacketRepository
Tff7b72import T7ee787org.meshtastic.core.data.repository.QuickChatActionRepository
Tff7b72import T7ee787org.meshtastic.core.data.repository.RadioConfigRepository
Tff7b72import T7ee787org.meshtastic.core.database.entity.ContactSettings
Tff7b72import T7ee787org.meshtastic.core.database.model.Message
Tff7b72import T7ee787org.meshtastic.core.database.model.Node
Tff7b72import T7ee787org.meshtastic.core.model.DataPacket
Tff7b72import T7ee787org.meshtastic.core.model.DeviceVersion
Tff7b72import T7ee787org.meshtastic.core.prefs.ui.UiPrefs
Tff7b72import T7ee787org.meshtastic.core.service.MeshServiceNotifications
Tff7b72import T7ee787org.meshtastic.core.service.ServiceAction
Tff7b72import T7ee787org.meshtastic.core.service.ServiceRepository
Tff7b72import T7ee787org.meshtastic.core.ui.viewmodel.stateInWhileSubscribed
Tff7b72import T7ee787org.meshtastic.proto.ConfigProtos.Config.DeviceConfig.Role
Tff7b72import T7ee787org.meshtastic.proto.channelSet
Tff7b72import T7ee787org.meshtastic.proto.sharedContact
Tff7b72import T7ee787timber.log.Timber
Tff7b72import T7ee787javax.inject.Inject

Tff7b72private Tff7b72const Tff7b72val Te6edf3VERIFIED_CONTACT_FIRMWARE_CUTOFF Tff7b72= Ta5d6ff"Ta5d6ff2.7.12Ta5d6ff"

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongParameterListTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffTooManyFunctionsTa5d6ff"Tb4b4b4)
Tf0883e@HiltViewModel
Tff7b72class T56d364MessageViewModel
Tf0883e@Inject
Tff7b72constructorTb4b4b4(
Te6edf3savedStateHandleTb4b4b4: Te6edf3SavedStateHandleTb4b4b4,
Tff7b72private Tff7b72val Te6edf3nodeRepositoryTb4b4b4: Te6edf3NodeRepositoryTb4b4b4,
Te6edf3radioConfigRepositoryTb4b4b4: Te6edf3RadioConfigRepositoryTb4b4b4,
Te6edf3quickChatActionRepositoryTb4b4b4: Te6edf3QuickChatActionRepositoryTb4b4b4,
Tff7b72private Tff7b72val Te6edf3serviceRepositoryTb4b4b4: Te6edf3ServiceRepositoryTb4b4b4,
Tff7b72private Tff7b72val Te6edf3packetRepositoryTb4b4b4: Te6edf3PacketRepositoryTb4b4b4,
Tff7b72private Tff7b72val Te6edf3uiPrefsTb4b4b4: Te6edf3UiPrefsTb4b4b4,
Tff7b72private Tff7b72val Te6edf3meshServiceNotificationsTb4b4b4: Te6edf3MeshServiceNotificationsTb4b4b4,
Tb4b4b4) Tb4b4b4: Te6edf3ViewModelTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72private Tff7b72val Te6edf3_title Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72val Te6edf3titleTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657StringTff7b72> Tff7b72= Te6edf3_titleTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

Tff7b72val Te6edf3ourNodeInfo Tff7b72= Te6edf3nodeRepositoryTb4b4b4.Te6edf3ourNodeInfo

Tff7b72val Te6edf3connectionState Tff7b72= Te6edf3serviceRepositoryTb4b4b4.Te6edf3connectionState

Tff7b72val Te6edf3nodeListTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3ListTff7b72<Te6edf3NodeTff7b72>Tff7b72> Tff7b72= Te6edf3nodeRepositoryTb4b4b4.Te6edf3getNodesTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(Te6edf3initialValue Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4)

Tff7b72val Te6edf3channels Tff7b72= Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3channelSetFlowTb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(Te6edf3channelSet Tb4b4b4{Tb4b4b4}Tb4b4b4)

Tff7b72private Tff7b72val Te6edf3_showQuickChat Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Te6edf3uiPrefsTb4b4b4.Te6edf3showQuickChatTb4b4b4)
Tff7b72val Te6edf3showQuickChatTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657BooleanTff7b72> Tff7b72= Te6edf3_showQuickChat

Tff7b72val Te6edf3quickChatActions Tff7b72= Te6edf3quickChatActionRepositoryTb4b4b4.Te6edf3getAllActionsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(Te6edf3initialValue Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4)

Tff7b72val Te6edf3contactSettingsTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3MapTff7b72<Tffa657StringTb4b4b4, Te6edf3ContactSettingsTff7b72>Tff7b72> Tff7b72=
Te6edf3packetRepositoryTb4b4b4.Te6edf3getContactSettingsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(Te6edf3initialValue Tff7b72= Te6edf3emptyMapTb4b4b4(Tb4b4b4)Tb4b4b4)

Tff7b72private Tff7b72val Te6edf3contactKeyForPagedMessagesTb4b4b4: Te6edf3MutableStateFlowTff7b72<Tffa657String?Tff7b72> Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Tff7b72nullTb4b4b4)
Tff7b72private Tff7b72val Te6edf3pagedMessagesForContactKeyTb4b4b4: Te6edf3FlowTff7b72<Te6edf3PagingDataTff7b72<Te6edf3MessageTff7b72>Tff7b72> Tff7b72=
Te6edf3contactKeyForPagedMessages
Tb4b4b4.Te6edf3filterNotNullTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3flatMapLatest Tb4b4b4{ Te6edf3contactKey Tff7b72-Tff7b72> Te6edf3packetRepositoryTb4b4b4.Te6edf3getMessagesFromPagedTb4b4b4(Te6edf3contactKeyTb4b4b4, Tff7b72::Te6edf3getNodeTb4b4b4) Tb4b4b4}
Tb4b4b4.Te6edf3cachedInTb4b4b4(Te6edf3viewModelScopeTb4b4b4)

Tff7b72init Tb4b4b4{
Tff7b72val Te6edf3contactKey Tff7b72= Te6edf3savedStateHandleTb4b4b4.Te6edf3getTff7b72<Tffa657StringTff7b72>Tb4b4b4(Ta5d6ff"Ta5d6ffcontactKeyTa5d6ff"Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3contactKey Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3contactKeyForPagedMessagesTb4b4b4.Te6edf3value Tff7b72= Te6edf3contactKey
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffsetTitleTb4b4b4(Te6edf3titleTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{ Te6edf3_titleTb4b4b4.Te6edf3value Tff7b72= Te6edf3title Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffgetMessagesFromPagedTb4b4b4(Te6edf3contactKeyTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3FlowTff7b72<Te6edf3PagingDataTff7b72<Te6edf3MessageTff7b72>Tff7b72> Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3contactKeyForPagedMessagesTb4b4b4.Te6edf3value Tff7b72!Tff7b72= Te6edf3contactKeyTb4b4b4) Tb4b4b4{
Te6edf3contactKeyForPagedMessagesTb4b4b4.Te6edf3value Tff7b72= Te6edf3contactKey
Tb4b4b4}
Tff7b72return Te6edf3pagedMessagesForContactKey
Tb4b4b4}

Tff7b72fun Td2a8ffgetFirstUnreadMessageUuidTb4b4b4(Te6edf3contactKeyTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3FlowTff7b72<Tffa657Long?Tff7b72> Tff7b72=
Te6edf3packetRepositoryTb4b4b4.Te6edf3getFirstUnreadMessageUuidTb4b4b4(Te6edf3contactKeyTb4b4b4)

Tff7b72fun Td2a8ffhasUnreadMessagesTb4b4b4(Te6edf3contactKeyTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3FlowTff7b72<Tffa657BooleanTff7b72> Tff7b72= Te6edf3packetRepositoryTb4b4b4.Te6edf3hasUnreadMessagesTb4b4b4(Te6edf3contactKeyTb4b4b4)

Tff7b72fun Td2a8fftoggleShowQuickChatTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3toggleTb4b4b4(Te6edf3_showQuickChatTb4b4b4) Tb4b4b4{ Te6edf3uiPrefsTb4b4b4.Te6edf3showQuickChat Tff7b72= Tffa657it Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8fftoggleTb4b4b4(Te6edf3stateTb4b4b4: Te6edf3MutableStateFlowTff7b72<Tffa657BooleanTff7b72>Tb4b4b4, Te6edf3onChangedTb4b4b4: Tb4b4b4(Te6edf3newValueTb4b4b4: Tffa657BooleanTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Tb4b4b4(Tff7b72!Te6edf3stateTb4b4b4.Te6edf3valueTb4b4b4)Tb4b4b4.Te6edf3let Tb4b4b4{ Te6edf3toggled Tff7b72-Tff7b72>
Te6edf3stateTb4b4b4.Te6edf3update Tb4b4b4{ Te6edf3toggled Tb4b4b4}
Te6edf3onChangedTb4b4b4(Te6edf3toggledTb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffgetNodeTb4b4b4(Te6edf3userIdTb4b4b4: Tffa657String?Tb4b4b4) Tff7b72= Te6edf3nodeRepositoryTb4b4b4.Te6edf3getNodeTb4b4b4(Te6edf3userId Tff7b72?: Te6edf3DataPacketTb4b4b4.Te6edf3ID_BROADCASTTb4b4b4)

Tff7b72fun Td2a8ffgetUserTb4b4b4(Te6edf3userIdTb4b4b4: Tffa657String?Tb4b4b4) Tff7b72= Te6edf3nodeRepositoryTb4b4b4.Te6edf3getUserTb4b4b4(Te6edf3userId Tff7b72?: Te6edf3DataPacketTb4b4b4.Te6edf3ID_BROADCASTTb4b4b4)

T8b949e/**
* Sends a message to a contact or channel.
*
* If the message is a direct message (no channel specified), this function will:
* - If the device firmware version is older than 2.7.12, it will mark the destination node as a favorite to prevent
* it from being removed from the on-device node database.
* - If the device firmware version is 2.7.12 or newer, it will send a shared contact to the destination node.
*
* @param str The message content.
* @param contactKey The unique contact key, which is a combination of channel (optional) and node ID. Defaults to
* broadcasting on channel 0.
* @param replyId The ID of the message this is a reply to, if any.
*/
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffNestedBlockDepthTa5d6ff"Tb4b4b4)
Tff7b72fun Td2a8ffsendMessageTb4b4b4(Te6edf3strTb4b4b4: Tffa657StringTb4b4b4, Te6edf3contactKeyTb4b4b4: Tffa657String Tff7b72= Ta5d6ff"Ta5d6ff0Tffd700${Te6edf3DataPacketTb4b4b4.Te6edf3ID_BROADCASTTffd700}Ta5d6ff"Tb4b4b4, Te6edf3replyIdTb4b4b4: Tffa657Int? Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
T8b949e// contactKey: unique contact key filter (channel)+(nodeId)
Tff7b72val Te6edf3channel Tff7b72= Te6edf3contactKeyTff7b72[T79c0ff0Tff7b72]Tb4b4b4.Te6edf3digitToIntOrNullTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3dest Tff7b72= Tff7b72if Tb4b4b4(Te6edf3channel Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Te6edf3contactKeyTb4b4b4.Te6edf3substringTb4b4b4(T79c0ff1Tb4b4b4) Tff7b72else Te6edf3contactKey

T8b949e// if the destination is a node, we need to ensure it's a
T8b949e// favorite so it does not get removed from the on-device node database.
Tff7b72if Tb4b4b4(Te6edf3channel Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{ T8b949e// no channel specified, so we assume it's a direct message
Tff7b72val Te6edf3fwVersion Tff7b72= Te6edf3ourNodeInfoTb4b4b4.Te6edf3valueTff7b72?.Te6edf3metadataTff7b72?.Te6edf3firmwareVersion
Tff7b72val Te6edf3destNode Tff7b72= Te6edf3nodeRepositoryTb4b4b4.Te6edf3getNodeTb4b4b4(Te6edf3destTb4b4b4)
Tff7b72val Te6edf3isClientBase Tff7b72= Te6edf3ourNodeInfoTb4b4b4.Te6edf3valueTff7b72?.Te6edf3userTff7b72?.Te6edf3role Tff7b72=Tff7b72= Te6edf3RoleTb4b4b4.Te6edf3CLIENT_BASE
Te6edf3fwVersionTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3fw Tff7b72-Tff7b72>
Tff7b72val Te6edf3ver Tff7b72= Te6edf3DeviceVersionTb4b4b4(Te6edf3asString Tff7b72= Te6edf3fwTb4b4b4)
Tff7b72val Te6edf3verifiedSharedContactsVersion Tff7b72=
Te6edf3DeviceVersionTb4b4b4(
Te6edf3asString Tff7b72= Te6edf3VERIFIED_CONTACT_FIRMWARE_CUTOFFTb4b4b4,
Tb4b4b4) T8b949e// Version cutover to verified shared contacts

Tff7b72if Tb4b4b4(Te6edf3ver Tff7b72>Tff7b72= Te6edf3verifiedSharedContactsVersionTb4b4b4) Tb4b4b4{
Te6edf3sendSharedContactTb4b4b4(Te6edf3destNodeTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3destNodeTb4b4b4.Te6edf3isFavorite Tff7b72&Tff7b72& Tff7b72!Te6edf3isClientBaseTb4b4b4) Tb4b4b4{
Te6edf3favoriteNodeTb4b4b4(Te6edf3destNodeTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72val Te6edf3p Tff7b72= Te6edf3DataPacketTb4b4b4(Te6edf3destTb4b4b4, Te6edf3channel Tff7b72?: T79c0ff0Tb4b4b4, Te6edf3strTb4b4b4, Te6edf3replyIdTb4b4b4)
Te6edf3sendDataPacketTb4b4b4(Te6edf3pTb4b4b4)
Tb4b4b4}

Tff7b72fun Td2a8ffsendReactionTb4b4b4(Te6edf3emojiTb4b4b4: Tffa657StringTb4b4b4, Te6edf3replyIdTb4b4b4: Tffa657IntTb4b4b4, Te6edf3contactKeyTb4b4b4: Tffa657StringTb4b4b4) Tff7b72=
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{ Te6edf3serviceRepositoryTb4b4b4.Te6edf3onServiceActionTb4b4b4(Te6edf3ServiceActionTb4b4b4.Te6edf3ReactionTb4b4b4(Te6edf3emojiTb4b4b4, Te6edf3replyIdTb4b4b4, Te6edf3contactKeyTb4b4b4)Tb4b4b4) Tb4b4b4}

Tff7b72fun Td2a8ffdeleteMessagesTb4b4b4(Te6edf3uuidListTb4b4b4: Te6edf3ListTff7b72<Tffa657LongTff7b72>Tb4b4b4) Tff7b72=
Te6edf3viewModelScopeTb4b4b4.Te6edf3launchTb4b4b4(Te6edf3DispatchersTb4b4b4.Te6edf3IOTb4b4b4) Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3deleteMessagesTb4b4b4(Te6edf3uuidListTb4b4b4) Tb4b4b4}

Tff7b72fun Td2a8ffclearUnreadCountTb4b4b4(Te6edf3contactTb4b4b4: Tffa657StringTb4b4b4, Te6edf3messageUuidTb4b4b4: Tffa657LongTb4b4b4, Te6edf3lastReadTimestampTb4b4b4: Tffa657LongTb4b4b4) Tff7b72=
Te6edf3viewModelScopeTb4b4b4.Te6edf3launchTb4b4b4(Te6edf3DispatchersTb4b4b4.Te6edf3IOTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3existingTimestamp Tff7b72= Te6edf3contactSettingsTb4b4b4.Te6edf3valueTff7b72[Te6edf3contactTff7b72]Tff7b72?.Te6edf3lastReadMessageTimestamp Tff7b72?: Tffa657LongTb4b4b4.Te6edf3MIN_VALUE
Tff7b72if Tb4b4b4(Te6edf3lastReadTimestamp Tff7b72<Tff7b72= Te6edf3existingTimestampTb4b4b4) Tb4b4b4{
Tff7b72returnTf0883e@launch
Tb4b4b4}
Te6edf3packetRepositoryTb4b4b4.Te6edf3clearUnreadCountTb4b4b4(Te6edf3contactTb4b4b4, Te6edf3lastReadTimestampTb4b4b4)
Te6edf3packetRepositoryTb4b4b4.Te6edf3updateLastReadMessageTb4b4b4(Te6edf3contactTb4b4b4, Te6edf3messageUuidTb4b4b4, Te6edf3lastReadTimestampTb4b4b4)
Tff7b72val Te6edf3unreadCount Tff7b72= Te6edf3packetRepositoryTb4b4b4.Te6edf3getUnreadCountTb4b4b4(Te6edf3contactTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3unreadCount Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Te6edf3meshServiceNotificationsTb4b4b4.Te6edf3cancelMessageNotificationTb4b4b4(Te6edf3contactTb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8fffavoriteNodeTb4b4b4(Te6edf3nodeTb4b4b4: Te6edf3NodeTb4b4b4) Tff7b72= Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3serviceRepositoryTb4b4b4.Te6edf3onServiceActionTb4b4b4(Te6edf3ServiceActionTb4b4b4.Te6edf3FavoriteTb4b4b4(Te6edf3nodeTb4b4b4)Tb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3exTb4b4b4: Te6edf3RemoteExceptionTb4b4b4) Tb4b4b4{
Te6edf3TimberTb4b4b4.Te6edf3eTb4b4b4(Te6edf3exTb4b4b4, Ta5d6ff"Ta5d6ffFavorite node errorTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffsendSharedContactTb4b4b4(Te6edf3nodeTb4b4b4: Te6edf3NodeTb4b4b4) Tff7b72= Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72val Te6edf3contact Tff7b72= Te6edf3sharedContact Tb4b4b4{
Te6edf3nodeNum Tff7b72= Te6edf3nodeTb4b4b4.Te6edf3num
Te6edf3user Tff7b72= Te6edf3nodeTb4b4b4.Te6edf3user
Te6edf3manuallyVerified Tff7b72= Te6edf3nodeTb4b4b4.Te6edf3manuallyVerified
Tb4b4b4}
Te6edf3serviceRepositoryTb4b4b4.Te6edf3onServiceActionTb4b4b4(Te6edf3ServiceActionTb4b4b4.Te6edf3SendContactTb4b4b4(Te6edf3contact Tff7b72= Te6edf3contactTb4b4b4)Tb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3exTb4b4b4: Te6edf3RemoteExceptionTb4b4b4) Tb4b4b4{
Te6edf3TimberTb4b4b4.Te6edf3eTb4b4b4(Te6edf3exTb4b4b4, Ta5d6ff"Ta5d6ffSend shared contact errorTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffsendDataPacketTb4b4b4(Te6edf3pTb4b4b4: Te6edf3DataPacketTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3serviceRepositoryTb4b4b4.Te6edf3meshServiceTff7b72?.Te6edf3sendTb4b4b4(Te6edf3pTb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3exTb4b4b4: Te6edf3RemoteExceptionTb4b4b4) Tb4b4b4{
Te6edf3TimberTb4b4b4.Te6edf3eTb4b4b4(Ta5d6ff"Ta5d6ffSend DataPacket error: Tffd700${Te6edf3exTb4b4b4.Te6edf3messageTffd700}Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.07s